package com.face.managesystem.controller;

import com.face.managesystem.config.CodeCaptcha;
import com.face.managesystem.config.Result;
import com.face.managesystem.service.ManagerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 登录 和 注册 前端控制器。
 *
 *
 */
@RestController
public class LoginRegisterController {

    /**
     * 管理者 服务层。
     */
    @Autowired
    private ManagerService managerService;

    /**
     * 判断 是否存在该管理者信息。
     * @param userID：管理者ID。
     * @return
     *      查询的结果。
     */
    @GetMapping("/isUser")
    public Result<Boolean> isUser(@RequestParam("userID") String userID){
        System.out.println("userID = " + userID);

        // 判断当前用户是否存在于 “管理者信息” 数据表中。
        if ( userID!=null && managerService.isUser(userID)){
            // 若存在，存在则返回 true。
            return new Result<>(200,String.valueOf(true));
        }
        // 若不存在，不存在则返回 false。
        return new Result<>(0,String.valueOf(false));
    }

    /**
     * 表单登录。【单点登录：一个管理者，只能在一台设备上登录】
     *      200：成功。
     *      400：客户端问题。
     *      500：服务器问题。
     *
     * @param userID：管理者ID。
     * @param password：管理者密码。
     * @param code：验证码。
     * @return
     *      登录结果。
     *      pageUrl：控制后台管理的地址。
     */
    @PostMapping("/signIn")
    public Result<Map<String, String>> signIn(
            @RequestParam("userID") String userID,
            @RequestParam("password") String password,
            @RequestParam("code") String code,

            @CookieValue("JSESSIONID") String jsID     // 获取成功！JSESSIONID：是用户验证。【随着用户窗口关闭而消失】
    ){
        System.out.println("userID = " + userID);
        System.out.println("password = " + password);
        System.out.println("code = " + code);

        Map<String, String> map = new HashMap<>();
        // 首先根据验证码进行判断。若验证码不正确，则直接回传结果。
        try {
            //可能引发并发的问题。【已解决】
            // 验证码不正确。
            if (!CodeCaptcha.getCode().equalsIgnoreCase(code)){
                System.out.println("验证码不正确！！");
                return new Result<>(400,"验证码不正确！");
            }
            // 若验证码被使用，则直接销毁，【并且判断并发状态】。
            // 销毁验证码
            CodeCaptcha.destroy();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("该验证码已失效！");
            return new Result<>(499,"该验证码已失效！");

        }


        // 再判断用户名与密码是否正确。
        // 若正确，则修改在线状态为 true ，并且把当前对象存在一个线程中，进行用户独立。
        // 查询用户是否存在。
        if (managerService.login(userID,password)){

            // 判断用户是否正在登录。登录中，则拒绝登录。否则放行。
            if (!managerService.loginState(userID)){
                System.out.println("登录成功");
                //成功并回传后台管理页面！
                map.put("page","/managementSystem");
//            session.setAttribute("userID",userID);  // 服务器保存。
//
//            // 设置登录状态的 session。该 UUID 必须是static，否则会在使用地为null。
//            uuid = UUID.randomUUID().toString();
//            // 每次访问首页是会去设置一个id。
//            session.setAttribute("loginSession", uuid);

//                System.out.println("登录成功！");
                // 登录状态。
//                System.out.println("session: ==> （loginSession）：" + session.getAttribute("loginSession"));
                // 用户信息。
//                System.out.println("session: ==> （userID）：" + session.getAttribute("userID"));
                return new Result<>(200,"登录成功",  map);
            }
            System.out.println("已有用户在登录中");
            return new Result<>(0, "已有用户在登录中");
        }
        // 若不正确，则直接回传结果。
        else {
            System.out.println("用户名或密码错误");
            // 重新绘制验证码。【前端进行重新请求】
            // 失败之后
            return new Result<>(400,"用户名或密码错误");
        }
    }

    /**
     * 注册管理者。
     * @param userID：管理者ID。
     * @param password：密码。
     * @param email：邮箱。
     * @return
     *      注册结果。
     */
    @PostMapping("/register")
    public Result<String> register(
            @RequestParam("userID") String userID,
            @RequestParam("password") String password,
            @RequestParam("email") String email
    ){
        System.out.println("userID = " + userID);
        System.out.println("password = " + password);
        System.out.println("email = " + email);

        return new Result<>(200, "");
    }

}
